const vscode = require('vscode');
const path = require('path');
const fs = require('fs');
const os = require('os');
const { spawn } = require('child_process');

// ANSI 转义码处理函数
function processAnsiEscapes(text) {
  // 移除 ANSI 转义序列中的清屏和光标移动命令
  text = text.replace(/\r\[\d+[A-Z]/g, ''); // 移除光标上移
  text = text.replace(/\r\[K/g, ''); // 移除清除行
  text = text.replace(/\r/g, '\n'); // 将回车替换为换行
  
  // 保留颜色相关的 ANSI 转义码
  const colorCodes = {
    '\u001b[0;31m': '$(error)', // 红色
    '\u001b[0;32m': '$(check)', // 绿色
    '\u001b[1;33m': '$(warning)', // 黄色
    '\u001b[0;34m': '$(info)', // 蓝色
    '\u001b[0m': '', // 重置
    '\u001b[1m': '$(bold)' // 粗体
  };

  // 替换颜色代码为 VS Code 图标
  Object.keys(colorCodes).forEach(code => {
    text = text.replace(new RegExp(code.replace(/\[/g, '\\['), 'g'), colorCodes[code]);
  });

  return text;
}

/**
 * @param {vscode.ExtensionContext} context
 */
function activate(context) {
  console.log('PNG to WebP 扩展已激活');

  let disposable = vscode.commands.registerCommand('png2webp.convert', async (uri) => {
    if (!uri || !uri.fsPath) {
      vscode.window.showErrorMessage('请右键选择一个文件夹！');
      return;
    }

    try {
      // 获取配置
      const config = vscode.workspace.getConfiguration('png2webp');
      const quality = config.get('quality', 85);
      const deletePngAfterConversion = config.get('deletePngAfterConversion', false);

      const folderPath = uri.fsPath;
      
      // 创建终端
      const terminal = vscode.window.createTerminal('PNG to WebP');
      terminal.show();
      
      // 在临时目录中创建脚本文件
      const tmpDir = os.tmpdir();
      const scriptFileName = `png_to_webp_${Date.now()}.sh`;
      const scriptPath = path.join(tmpDir, scriptFileName);

      try {
        // 从扩展目录复制脚本到临时目录
        const extensionPath = context.extensionPath;
        const bundledScript = path.join(extensionPath, 'png_to_webp.sh');
        
        if (fs.existsSync(bundledScript)) {
          // 读取脚本内容并写入临时目录
          fs.copyFileSync(bundledScript, scriptPath);
          fs.chmodSync(scriptPath, '755');
        } else {
          vscode.window.showErrorMessage('❌ 未找到 png_to_webp.sh，请确保扩展安装正确！');
          return;
        }
      } catch (err) {
        vscode.window.showErrorMessage('❌ 准备转换脚本失败：' + err.message);
        return;
      }

      // 用于跟踪脚本状态
      let conversionState = {
        started: false,
        completed: false,
        hasError: false
      };

      // 构建命令，添加特殊标记用于跟踪状态
      const command = `echo "CONVERSION_START_$$" && "${scriptPath}" "${folderPath}" ${quality} ${deletePngAfterConversion ? 1 : 0} && echo "CONVERSION_SUCCESS_$$" || echo "CONVERSION_ERROR_$$"`;
      
      // 监听终端数据事件（如果可用）
      if ('onDidWriteData' in terminal) {
        const dataDisposable = terminal.onDidWriteData((data) => {
          if (data.includes('CONVERSION_START_')) {
            conversionState.started = true;
          }
          if (data.includes('CONVERSION_SUCCESS_')) {
            conversionState.completed = true;
            dataDisposable.dispose();
            // 删除临时脚本文件
            try {
              fs.unlinkSync(scriptPath);
            } catch (err) {
              // 忽略删除临时文件的错误
            }
            vscode.window.showInformationMessage('✅ PNG 转换 WebP 完成！');
          }
          if (data.includes('CONVERSION_ERROR_')) {
            conversionState.hasError = true;
            dataDisposable.dispose();
            // 删除临时脚本文件
            try {
              fs.unlinkSync(scriptPath);
            } catch (err) {
              // 忽略删除临时文件的错误
            }
            vscode.window.showErrorMessage('❌ 转换失败，请查看终端输出了解详情。');
          }
        });
      }

      // 在终端中执行命令
      terminal.sendText(command);

      // 监听终端关闭事件
      const closeDisposable = vscode.window.onDidCloseTerminal(closedTerminal => {
        if (closedTerminal === terminal) {
          // 只有在脚本已开始但未正常完成，且有错误时才显示错误消息
          if (conversionState.started && !conversionState.completed && conversionState.hasError) {
            vscode.window.showErrorMessage('❌ 转换失败，请查看终端输出了解详情。');
          }
          // 确保临时脚本文件被删除
          try {
            if (fs.existsSync(scriptPath)) {
              fs.unlinkSync(scriptPath);
            }
          } catch (err) {
            // 忽略删除临时文件的错误
          }
          closeDisposable.dispose();
        }
      });
    } catch (err) {
      vscode.window.showErrorMessage('❌ ' + err.message);
      return;
    }
  });

  context.subscriptions.push(disposable);
}

function deactivate() {
  // 清理工作
}

module.exports = {
  activate,
  deactivate
};
